package org.example.SolutionNew001;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class Matrix01 {
    public static void main(String[] args) {
        Matrix01 m=new Matrix01();
        int[][] Matrix=new int[][]{{1,1,1},{1,0,1},{1,1,1}};
        m.setZeroes(Matrix);

    }

    //记录需要置0的行和列，在遍历后统一置0
    public void setZeroes1(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        Set<Integer> row = new HashSet<Integer>();
        Set<Integer> col = new HashSet<>();

        for(int i = 0;i<m;i++){
            for(int j = 0;j<n;j++){
                if(matrix[i][j]==0){
                    row.add(i);
                    col.add(j);
                }
            }
        }

        for(int i = 0;i<m;i++){
            for(int j = 0;j<n;j++){
                if(row.contains(i) || col.contains(j)){
                    matrix[i][j]=0;
                }
            }
        }
//        for(int[] r:matrix){
//            System.out.println(Arrays.toString(r));
//        }
    }

    public void setZeroes2(int[][] matrix) {
        int m = matrix.length,n = matrix[0].length;
        boolean firstRow = false;
        boolean firstCol = false;
        for(int i=0;i<n;i++){
            if(matrix[0][i]==0){
                firstRow=true;
                break;
            }
        }
        for(int i=0;i<m;i++){
            if(matrix[i][0]==0){
                firstCol=true;
                break;
            }
        }
        for(int i=1;i<m;i++){
            for(int j=1;j<n;j++){
                if(matrix[i][j]==0){
                    matrix[0][j]=0;
                    matrix[i][0]=0;
                }
            }
        }
        for(int i=1;i<m;i++){
            for(int j=1;j<n;j++){
                if(matrix[0][j]==0||matrix[i][0]==0){
                    matrix[i][j]=0;
                }
            }
        }
        if(firstRow){
            for(int i=0;i<n;i++){
                matrix[0][i]=0;
            }
        }
        if(firstCol){
            for(int i=0;i<m;i++){
                matrix[i][0]=0;
            }
        }
//        for(int[] r:matrix){
//            System.out.println(Arrays.toString(r));
//        }
    }

    public void setZeroes(int[][] matrix) {
        int m = matrix.length,n = matrix[0].length;
        boolean firstCol=false;

        for(int i=0;i<m;i++){
            if(matrix[i][0]==0){
                firstCol=true;
            }
            for(int j=1;j<n;j++){
                if(matrix[i][j]==0){
                    matrix[0][j]=0;
                    matrix[i][0]=0;
                }
            }
        }

        for(int i=m-1;i>=0;i--){
            for(int j=1;j<n;j++){
                if(matrix[0][j]==0||matrix[i][0]==0){
                    matrix[i][j]=0;
                }
            }
            if(firstCol){
                matrix[i][0]=0;
            }
        }
    }
}
